package com.gitee.wsl.text.replacer

/**
 * 抽象字符串替换类<br></br>
 * 通过实现replace方法实现局部替换逻辑
 *
 * @author looly
 * @since 4.1.5
 */
abstract class AbstractStrReplacer:StrReplacer{
    /**
     * 抽象的字符串替换方法，通过传入原字符串和当前位置，执行替换逻辑，返回处理或替换的字符串长度部分。
     *
     * @param str 被处理的字符串
     * @param pos 当前位置
     * @param out 输出
     * @return 处理的原字符串长度，0表示跳过此字符
     */
    abstract fun replace(str: CharSequence, pos: Int, out: Appendable): Int

    override fun replace(text: CharSequence): String {
        val len = text.length
        val builder = StringBuilder(len)
        var pos = 0 //当前位置
        var consumed: Int //处理过的字符数
        while (pos < len) {
            consumed = replace(text, pos, builder)
            if (0 == consumed) {
                //0表示未处理或替换任何字符，原样输出本字符并从下一个字符继续
                builder.append(text[pos])
                pos++
            }
            pos += consumed
        }
        return builder.toString()
    }
}